import { MiddlewareConsumer, Module } from '@nestjs/common';
import { ThrottlerModule } from '@nestjs/throttler';
import { ConfigModule } from '@nestjs/config';
import { ManagerModule } from './manager/manager.module';

import { getConfig } from './config/index';
import { APP_GUARD } from '@nestjs/core'; // NestJS内置的一个令牌（token），用于指定全局守卫

import { DatabaseModule } from './common/database/database.module';
import { RedisModule } from './common/redis/redis.module';
import { JwtAuthGuard, PermissionGuard, WinstonModule,WinstonConfig, OperationLogMiddleware } from '@/common/index';
import commonModules from './business/business.module';



@Module({
  imports: [
    // 全局导入ConfigModule
    ConfigModule.forRoot({
      isGlobal: true,
      load: [getConfig]
    }),
    ThrottlerModule.forRoot([
      {
        name: 'short',
        ttl: 1000,
        limit: 3
      },
      {
        name: 'medium',
        ttl: 10000,
        limit: 20
      },
      {
        name: 'long',
        ttl: 60000,
        limit: 100
      }
    ]),

    DatabaseModule, // 数据库
    WinstonModule.forRoot(WinstonConfig),
    RedisModule, // redis
    ...commonModules,
    ManagerModule
  ],
  controllers: [],
  providers: [
    // 全局注册
    {
      provide: APP_GUARD, // NestJS内置的一个令牌（token），用于指定全局守卫
      useClass: JwtAuthGuard // 使用JwtAuthGuard类作为全局守卫
    },
    {
      provide: APP_GUARD,
      useClass: PermissionGuard
    }
  ]
})
export class AppModule {
  configure(consumer: MiddlewareConsumer) {  
    // 全局注册中间件  
    consumer.apply(OperationLogMiddleware).forRoutes('*'); // '*' 表示所有路由  
  } 
}
